package com.z.redis.command.impl;

import com.z.redis.RedisCore;
import com.z.redis.command.Command;
import com.z.redis.command.CommandType;
import com.z.redis.datatype.BytesWrapper;
import com.z.redis.resp.BulkString;
import com.z.redis.resp.Resp;
import io.netty.channel.ChannelHandlerContext;

import java.lang.management.ManagementFactory;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

/**
 * 查看数据库信息
 */
public class Info implements Command {

    @Override
    public CommandType type(){
        return CommandType.info;
    }

    @Override
    public void setContent(Resp[] array){}

    /**
     * 模拟Redis的INFO响应
     * @param ctx 通信管道 用于像客户端发送响应
     * @param redisCore 内存数据库 提供API操作键值对
     */
    @Override
    public void handle(ChannelHandlerContext ctx, RedisCore redisCore){
        // 模拟服务器信息列表
        List<String> list = new ArrayList<>();
        list.add("redis_version:jfire_redis_mock");
        list.add("os:" + System.getProperty("os.name"));
        list.add("process_id:" + getPid());
        // 拼接成多行字符串 每行以\r\n 分隔
        Optional<String> reduce = list.stream().map(name -> name + "\r\n").reduce((first, second) -> first + second);
        // 发送响应
        String s = reduce.get();
        ctx.writeAndFlush(new BulkString(new BytesWrapper(s.getBytes(CHARSET))));
    }

    private String getPid(){
        String name = ManagementFactory.getRuntimeMXBean().getName(); // 格式：pid@hostname
        String pid = name.split("@")[0]; // 提取PID
        return pid;
    }
}
